/**
 * 给你一个 m 行 n 列的矩阵 matrix ，
 * 请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
 */

const matrix = [[1,2,3],[4,5,6],[7,8,9]]

function traverse(arr) {
    let result = []
    // 遍历最上面一层数据
    result.push(matrix[0].join(','))
    let i=matrix[0].length-1;
    // 找到最后一列数据
    for(j=1; j<matrix.length; j++){
        result.push(matrix[j][i])
    }
    // 找到最后一行
    for(let k=n-2;k>0;k--){
        result.push(matrix[m][k])
    }
}

/**
 * 可以定义四个角落的坐标,和上面一样,从左向右,从上向下,再从右到左,再从下到上遍历,就按照顺序那样
 */

function reverseTree(arr) {
    // 边缘情况
    if(!arr.length || !arr[0].length) {
        return []
    }

    let result = []
    const rows = arr.length,columns = arr[0].length

    let left =0, right = columns-1,top=0,bottom=rows-1
    // 如果一直没有循环到一个点上,就一直循环
    while(left<right && top<bottom) {
        for(i=left; i<=right; i++) {
            result.push(arr[top][i])
        }
        for(j=top+1;j<=bottom;j++){
            result.push(arr[j][right])
        }
        // 这里为什么还有来一遍,不理解
        if (left < right && top < bottom) {
            for (let column = right - 1; column > left; column--) {
                result.push(matrix[bottom][column]);
            }
            for (let row = bottom; row > top; row--) {
                result.push(matrix[row][left]);
            }
        }
        [left, right, top, bottom] = [left + 1, right - 1, top + 1, bottom - 1];
    }
    console.log(result);
}

// reverseTree(matrix)

function reverseTree2(arr) {
    if(!arr.length || !arr[0].length) {
        return []
    }

    let result = []
    const rows= arr.length, columns = arr[0].length
    let left=0,right = rows-1,top=0,bottom = columns-1

    while(left<right && top<bottom){
        for(let i=left;i<right; i++) {
            result.push(arr[top][i])
        }
        for(let i=top;i<bottom;i++){
            result.push(arr[i][right])
        }
        for(let i=right;i>left;i--){
            result.push(arr[bottom][i])
        }
        for(let i=bottom;i>top;i--){
            result.push(arr[i][left])
        }
        right--;top++;left++;bottom--
    }

    if(left===right){
      // 从上向下
      // 这里必须得《= 因为其实只有一个值了,相邻的两个,取最后一个,所以需要等于
      for (let i = top; i <= bottom; i++) {
        result.push(arr[i][left]);
      }
    }else if(top===bottom){
      //从做到右
      for (let i = left; i <= right; i++) {
        result.push(arr[(top, i)]);
      }
    }
    return result;

}
console.log(reverseTree2(matrix));